package model;

public class GameBoard {

	private Slot[][] board;
	private int rows, cols;

	public GameBoard(int rows, int cols) {
		this.rows = rows;
		this.cols = cols;
		board = new Slot[this.rows][this.cols];
		initBoard();
	}

	/**
	 * Inizializza l'area di gioco. Ogni slot viene impostato come Slot.FREE
	 */
	private void initBoard() {
		for (int i=0;i<rows;i++) {
			for (int j=0;j<cols;j++)
				board[i][j] = Slot.FREE;
		}

	}

	/**
	 * Cambia lo stato della board impostando lo slot in posizione [row][col]
	 * 
	 * @param s
	 * @param row
	 * @param col
	 * @return false se la posizione specificata non � valida.
	 */
	public boolean setSlot(Slot s, int row, int col) {
		if (row < rows && col < cols && row >= 0 && col >= 0) {
			board[row][col] = s;
			return true;
		} else {
			return false;
		}
	}

	/**
	 * Ottiene lo stato di uno spazio di gioco (slot).
	 * 
	 * @param row
	 * @param col
	 * @return
	 */
	public Slot getSlot(int row, int col) {
		return board[row][col];
	}

	/**
	 * Restituisce una copia della matrice di slot utilizzata come game board
	 * 
	 * @return
	 */
	public Slot[][] getBoard() {
		Slot[][] copy = board.clone();
		for (int i = 0; i < board.length; i++) {
		    copy[i] = board[i].clone();
		}
		return copy;
	}

	public int getRows() {
		return rows;
	}

	public int getCols() {
		return cols;
	}

	/**
	 * Ottiene la prima riga libera (a partire dal basso) in cui � possibile
	 * inserire
	 * 
	 * @param col
	 * @return indice di riga libera, altrimenti -1 se tutta la colonna � occupata.
	 */
	public int getFreeRow(int col) {
		int i = rows-1;
		while(i >= 0 && !board[i][col].equals(Slot.FREE))
		{
			i--;
		}
		return i;
	}

}
